import Is from "./is";
const { isString } = Is;

export function randomInt(n1: number, n2: number) {
  const max = Math.max(n1, n2),
    min = Math.min(n1, n2);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
export function randomColor() {
  return `#${Math.floor(Math.random() * 16777215)
    .toString(16)
    .padEnd(6, "0")}`;
}

export function randomBoolean() {
  return Math.random() >= 0.5;
}
export function radomArrayIndex<T = any>(arr: T[]) {
  if (arr.length === 0) throw new Error("arr not is empty");
  return Math.floor(Math.random() * arr.length);
}

/**
 * 获取设备的DPI（每英寸点数）
 * @returns 返回设备的DPI值
 */
export function getDeviceDpi() {
  // 创建一个div元素
  const div = document.createElement("div");
  // 设置div的宽度为1英寸
  div.style.width = "1in";
  // 设置div为不可见，不影响页面布局
  div.style.visibility = "hidden";
  // 将div添加到body中
  document.body.appendChild(div);
  // 获取div的offsetWidth，这个值就是1英寸对应的像素数，即DPI
  const dpi = div.offsetWidth;
  // 从body中移除div，清理DOM
  document.body.removeChild(div);
  // 返回DPI值
  return dpi;
}

export function imageToBase64(imgUrl: string, quality = 0.9) {
  const img = new Image(); // 创建一个Image对象
  // 因为是网络资源所以会有图片跨域问题产生，此属性可以解决跨域问题
  img.setAttribute("crossOrigin", "anonymous"); // 设置跨域属性
  // 如果需要兼容 iOS，这两个顺序一定不能换，先设置 crossOrigin 后设置 src
  img.src = imgUrl; // 设置图片的URL
  return new Promise((resolve, reject) => {
    img.onload = () => {
      const cvs = document.createElement("canvas");
      cvs.width = img.width;
      cvs.height = img.height;
      const ctx = cvs.getContext("2d");
      if (!ctx) return reject("ctx is null"); // 获取canvas的2D上下文
      ctx.drawImage(img, 0, 0, img.width, img.height); // 在canvas上绘制图片
      resolve(cvs.toDataURL("image/jpeg", quality)); // 将canvas转换为base64格式的图片数据
    };
    img.onerror = (e) => reject(`img load error,${e}`);
  });
}

/**
 * 创建一个下载链接并触发文件下载
 * @param fileUrl 文件URL，可以是字符串、Blob对象或File对象
 * @param fileName 可选的文件名，如果不提供则使用当前时间戳作为文件名
 */
export function linkDownload(fileUrl: string | Blob | File, fileName?: string) {
  // 如果fileUrl不是字符串类型（Blob或File），则将其转换为临时URL
  if (!isString(fileUrl)) {
    fileUrl = URL.createObjectURL(fileUrl);
  }
  // 创建一个a元素用于下载
  const a = document.createElement("a");
  // 设置a元素不可见
  a.style.display = "none";
  // 设置下载链接的URL
  a.href = fileUrl;
  // 设置下载的文件名，如果没有提供则使用当前时间戳
  a.download = fileName || Date.now().toString();
  // 将a元素添加到body中
  document.body.appendChild(a);
  // 触发点击事件开始下载
  a.click();
  // 下载完成后移除a元素
  document.body.removeChild(a);
  // 如果fileUrl不是字符串类型（之前转换过的），则释放创建的URL对象
  if (!isString(fileUrl)) {
    URL.revokeObjectURL(fileUrl);
  }
}

export function copyText(value: string | number | object) {
  let text: string;
  const isClipboardApiSupported =
    window.navigator && window.navigator.clipboard;

  if (typeof value === "string") {
    text = value;
  } else if (typeof value === "number") {
    text = value.toString();
  } else if (typeof value === "object") {
    text = JSON.stringify(value, null, 2);
  } else {
    throw new Error("value type error");
  }
  if (isClipboardApiSupported) {
    window.navigator.clipboard.writeText(text);
  } else {
    const textarea = document.createElement("textarea");
    textarea.readOnly = true;
    textarea.value = text;
    textarea.style.position = "absolute";
    textarea.style.left = "-9999px";
    textarea.style.top = "-9999px";
    document.body.appendChild(textarea);
    textarea.select();
    document.execCommand("copy");
    document.body.removeChild(textarea);
  }
}
